/**
 * 项目名：	Rumba Plan
 * 
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2006，所有权利保留。
 * 
 * 文件名：	BCartridge.java
 * 模块说明：	
 * 修改历史：
 * 2006-10-25 - lxm - 创建。
 */
package com.hd123.rumba.cartridge.biz;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.w3c.dom.Document;

import com.hd123.rumba.cartridge.CCartridge;
import com.hd123.rumba.domain.biz.IBDomainMgr;
import com.hd123.rumba.domain.biz.SDomain;
import com.hd123.rumba.exception.BusinessException;
import com.hd123.rumba.gwt.base.client.exception.ClientBizException;
import com.hd123.rumba.runtime.IPersistent;
import com.hd123.rumba.runtime.NamingMgr;
import com.hd123.rumba.runtime.biz.BVersionedPersistent;
import com.hd123.rumba.util.Version;

/**
 * 构件包 | 业务层.维护 | 实体
 * <p>
 * 
 * 代表由执行代码所组成的构件包。其中的版本号Version，表示执行代码的版本号。
 * <p>
 * 
 * 每个构件包的设计者都要在自己的执行代码中包含一个代表构件包的这个类。
 * <p>
 * 
 * 构件包之间存在安装依赖关系BCartReference。<br>
 * 一个构件包内存在多个功能视图BCartFunctionView。<br>
 * 
 * @author lxm
 * 
 */
public abstract class BCartridge extends BVersionedPersistent {

  /** 属性：所属域 */
  private SDomain domain;
  /** 属性：唯一前缀 */
  private String prefix;
  /** 属性：标题（中文） */
  private String caption;
  /** 属性：标题（英文） */
  private String captionEN;
  /** 属性：版本号 */
  private Version version;
  /** 属性：说明 */
  private String remark;
  /** 属性：构件包功能视图列表 */
  private List<BCartFunctionView> functionViews;
  /** 属性：依赖关系列表 */
  private List<BCartReference> references;
  /** 升级包列表，其中包含了升级包的类名。 */
  private List<String> upgradeClassNames;
  /** 是否可以作为系统封面，默认为false。 */
  private Boolean asCover;
  /** 版权信息。 */
  private String copyright;
  /**
   * 对应资源表。<br>
   * 其中存放了与构件包相关的资源文件的url。通过key的方式进行访问，可选的key由表示层设计决定。
   */
  private Map<String, String> resources;

  public BCartridge() {
    super();
    uuid = this.getClass().getName();
    try {
      IBDomainMgr dmMgr = (IBDomainMgr) NamingMgr.getInstance().lookupMgr(IBDomainMgr.class);
      domain = dmMgr.getRootDomain();
    } catch (Exception e) {
      domain = null;
    }
    caption = uuid;
    prefix = "";
    version = new Version("0.0.0.0");
    functionViews = new ArrayList();
    references = new ArrayList();
    upgradeClassNames = new ArrayList();
    resources = new HashMap();
    fetchPropValues();
  }

  /**
   * 克隆一个简单构件包对象。
   * 
   * @return
   */
  public SCartridge cloneSimple() throws BusinessException {
    SCartridge scart = new SCartridge();
    try {
      scart.setUuid(this.uuid);
    } catch (ClientBizException e) {
      throw new BusinessException(e);
    }
    scart.setPrefix(this.prefix);
    scart.setCaption(this.caption);
    return scart;
  }

  public void readFrom(IPersistent source) throws BusinessException {
    throw new BusinessException("Never call me!");
  }

  /**
   * 数据初始化。<br>
   * 设计者要求当对象被创建后，应该尽快调用此方法。
   * 
   * @throws BusinessException
   */
  public void init() throws BusinessException {
    IBCartridgeMgr cartMgr = (IBCartridgeMgr) NamingMgr.getInstance().lookupMgr(
        IBCartridgeMgr.class);
    Document configDoc = cartMgr.getCartridgeConfigDocument(this.getClass());
    if (configDoc == null)
      throw new BusinessException("缺少对应" + CCartridge.CAPTION_CLASS + this.getClass().getName()
          + "的配置文件(*.cart.xml)。");
    cartMgr.initCartridgeByConfig(this, configDoc);
  }

  public String getCaption() {
    return caption;
  }

  void setCaption(String caption) {
    this.caption = caption;
  }

  public SDomain getDomain() {
    if (domain == null)
      try {
        IBDomainMgr dmMgr = (IBDomainMgr) NamingMgr.getInstance().lookupMgr(IBDomainMgr.class);
        domain = dmMgr.getRootDomain();
      } catch (Exception e) {
        domain = null;
      }
    return domain;
  }

  void setDomain(SDomain domain) {
    this.domain = domain;
  }

  public List<BCartFunctionView> getFunctionViews() {
    return functionViews;
  }

  public String getPrefix() {
    return prefix;
  }

  public List<BCartReference> getReferences() {
    return references;
  }

  public String getRemark() {
    return remark;
  }

  void setRemark(String remark) {
    this.remark = remark;
  }

  public Version getVersion() {
    return version.clone();
  }

  void setVersion(Version version) {
    this.version = version;
  }

  public List<String> getUpgradeClassNames() {
    return upgradeClassNames;
  }

  private void fetchPropValues() {
    Field[] fields = this.getClass().getDeclaredFields();
    for (int i = 0; i < fields.length; i++)
      try {
        if ("CART_PREFIX".equals(fields[i].getName()))
          prefix = (String) fields[i].get(null);
      } catch (IllegalArgumentException e) {
      } catch (IllegalAccessException e) {
      }
  }

  public Boolean getAsCover() {
    return asCover;
  }

  void setAsCover(Boolean asCover) {
    this.asCover = asCover;
  }

  public String getCopyright() {
    return copyright;
  }

  void setCopyright(String copyright) {
    this.copyright = copyright;
  }

  public Map<String, String> getResources() {
    return resources;
  }

  public String getCaptionEN() {
    return captionEN;
  }

  void setCaptionEN(String captionEN) {
    this.captionEN = captionEN;
  }
}
